# 套路1：由于野鸡平台的功能研发进展缓慢，为了维持用户粘性其在19年推出锁仓复投模式，每锁入100个币，可每周解锁4个，50周返完，就是1年币量翻倍，后续这个比例线性降低，直到20年底最后一期锁仓时每100个每周仅返3个，如此模式意味着可以周为单位复投，套路早已结束，当时我的币量最终翻了5倍多，价格约腰斩，现在平台也还在，但价格已经跌烂了
# 账号是双线展开的，不过是不严格的双线，仅仅下线影响上线时按双线算，应该用二叉树写的，不过当时不会，后来也懒得改了，模型2就用了多叉树
# 账号基本属性:{层级，持币量，解锁时间列表}
RATE = 1.5  # 锁仓倍率，由19年底的2.0倍率以10%的速度不断在降低，至20年10月降至1.5，等到1.0就没意义了，到时候就可以去新项目重头开始，当前这个复投也相当可观，才1年我都约有700%的收益了
class User:
    '''
    :level-->账号层级
    :coin-->初始持币量
    '''
    def __init__(self, level, coin):  # 初始化层级，初始持币，每个账号只初始化一次
        self.level = level
        self.coin = coin
        self.time_ls = [7+7*j for j in range(50)]           # 存放每笔资金释放倒计时列表
        self.card_money_ls = [20*RATE for _ in range(50)]   # 存放每笔资金数额列表
        self.task_money = 1000      # 记录投入总量，初始至少1000，就当默认了

    # 注入方法,type(t)-->float
    def task_insert(self, money):
        self.coin -= money          # 扣除持币量
        self.task_money += money    # 累积到投入总量
        self.freeze_func(money)     # 刷新释放时间列表
    
    # 投入锁仓方法
    def freeze_func(self, money):      # 不能用字典记录，以免乱序
        if not self.time_ls:    # 时间列表为空的判定
            self.time_ls = [7+7*j for j in range(50)]
            self.card_money_ls = [RATE/50*money for _ in range(50)]
        else:                   # 理论上不存在超时未解锁的情形，直接补满50个时间点
            num = 50 - len(self.time_ls)    # 需补满的张数
            for i in range(num):
                self.time_ls.append(self.time_ls[-1]+7)
                self.card_money_ls.append(0)
            self.card_money_ls = list(map(lambda x: x+RATE/50*money, self.card_money_ls))
        # print(self.level, self.time_ls, self.card_money_ls)

    # 资金释放方法
    def release_func(self, cost):
        if self.time_ls[0] <= 0:
            cost += self.card_money_ls.pop(0)
            self.time_ls.pop(0)
        return cost

    # 时间列表整体前移方法，下线账号投入将缩短上线账号的释放时间
    def reduce_time(self, cost):
        self.time_ls = list(map(lambda x: x-0.5, self.time_ls))
        return self.release_func(cost)

# 实例化多个账号，方便让自己的大号资金回收更快些
class Run:
    def __init__(self):
        self.user0 = User('0', 100)
        self.user1 = User('1', 100)
        self.user2 = User('2', 100)
        self.user3 = User('11', 100)
        self.user4 = User('12', 100)
        self.user5 = User('21', 100)
        self.user6 = User('22', 100)
        self.user7 = User('111', 100)
        self.fluent_ls = []  # 流动资金列表
        self.freeze_ls = []  # 冻结资金列表
    
    # 省略一个随时间推移的复投方法，上下级账号还能影响解锁时间，逻辑比较复杂突然不想写了...